\documentclass[11pt,a4paper,oneside,oldfontcommands]{ctexart}
\usepackage{tabularx}
\usepackage{array}
\usepackage{bm}
\usepackage{hyperref}
\usepackage{amsmath}
\usepackage{algorithm}
\usepackage{graphicx}
\usepackage{subfigure}
\usepackage[table,xcdraw]{xcolor}
%\usepackage{algorithm2e}
\usepackage{algorithmicx}
\usepackage{algpseudocode}
\usepackage{fancyhdr}
\pagestyle{fancy}
\usepackage{color}
\usepackage{xcolor}
\usepackage{float}
\definecolor{keywordcolor}{rgb}{0.8,0.1,0.5}
\usepackage{listings}
\hypersetup{hypertex=true,
	colorlinks=true,
	linkcolor=red,
	anchorcolor=blue,
	citecolor=blue}

\fancyhf{}
\fancyhead[r]{\bfseries\thepage}
\fancyhead[l]{\bfseries\rightmark}
\renewcommand{\headrulewidth}{0.4pt} % 注意不用 \setlength
\renewcommand{\footrulewidth}{0pt}

\floatname{algorithm}{算法}
\renewcommand{\algorithmicrequire}{\textbf{输入:}}
\renewcommand{\algorithmicensure}{\textbf{输出:}}
\definecolor{mygreen}{rgb}{0,0.6,0}  
\definecolor{mygray}{rgb}{0.5,0.5,0.5}  
\definecolor{mymauve}{rgb}{0.58,0,0.82}  
\lstset{ %  
	backgroundcolor=\color{white},   % choose the background color; you must add \usepackage{color} or \usepackage{xcolor}  
	basicstyle=\footnotesize,        % the size of the fonts that are used for the code  
	breakatwhitespace=false,         % sets if automatic breaks should only happen at whitespace  
	breaklines=true,                 % sets automatic line breaking  
	captionpos=bl,                    % sets the caption-position to bottom  
	commentstyle=\color{mygreen},    % comment style  
	deletekeywords={...},            % if you want to delete keywords from the given language  
	escapeinside={\%*}{*)},          % if you want to add LaTeX within your code  
	extendedchars=true,              % lets you use non-ASCII characters; for 8-bits encodings only, does not work with UTF-8  
	frame=single,                    % adds a frame around the code  
	keepspaces=true,                 % keeps spaces in text, useful for keeping indentation of code (possibly needs columns=flexible)  
	keywordstyle=\color{blue},       % keyword style  
	%language=Python,                 % the language of the code  
	morekeywords={*,...},            % if you want to add more keywords to the set  
	numbers=left,                    % where to put the line-numbers; possible values are (none, left, right)  
	numbersep=5pt,                   % how far the line-numbers are from the code  
	numberstyle=\tiny\color{mygray}, % the style that is used for the line-numbers  
	rulecolor=\color{black},         % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here))  
	showspaces=false,                % show spaces everywhere adding particular underscores; it overrides 'showstringspaces'  
	showstringspaces=false,          % underline spaces within strings only  
	showtabs=false,                  % show tabs within strings adding particular underscores  
	stepnumber=1,                    % the step between two line-numbers. If it's 1, each line will be numbered  
	stringstyle=\color{orange},     % string literal style  
	tabsize=2,                       % sets default tabsize to 2 spaces  
	%title=myPython.py                   % show the filename of files included with \lstinputlisting; also try caption instead of title  
}  
\begin{titlepage}
	\title{\Huge\textbf{计算方法实习题报告}\\}
	\author{\Large\textbf{作者}：吴润泽 \and{\Large\textbf{学号}：181860109}\\
		\\
		\and {\Large\textbf{Email}：\href{mailto:181860109@smail.nju.edu.cn}{181860109@smail.nju.edu.cn}}\\}
	\date{\Large\today}
\end{titlepage}
\begin{document}
	\maketitle
	\tableofcontents
    \newpage
    \section*{程序环境说明}
	\markright{程序环境说明}
    \addcontentsline{toc}{section}{程序环境说明}
    \begin{tabular}{|c|c|}
        \hline
        \rowcolor[HTML]{F3F2EE} 
        {\color[HTML]{1F0909} \textbf{操作系统}} & {\color[HTML]{1F0909} WINDOWS 10家庭中文版} \\ \hline
        \rowcolor[HTML]{F3F2EE} 
        {\color[HTML]{1F0909} \textbf{处理器}} & {\color[HTML]{1F0909} Intel(R) Core(TM)i7-9750H CPU @ 2.60Hz} \\ \hline
        \rowcolor[HTML]{E8E7E7} 
        {\color[HTML]{1F0909} \textbf{内存}} & {\color[HTML]{1F0909} 16.0GB} \\ \hline
        \rowcolor[HTML]{F3F2EE} 
        {\color[HTML]{1F0909} \textbf{系统类型}} & {\color[HTML]{1F0909} 64位操作系统，基于x64的处理器} \\ \hline
        \rowcolor[HTML]{E8E7E7} 
        {\color[HTML]{1F0909} \textbf{算法语言}} & {\color[HTML]{1F0909} Matlab} \\ \hline
    \end{tabular}
	\section*{实习题一之三次样条插值}
	\markright{实习题一之三次样条插值}
    \addcontentsline{toc}{section}{实习题一之三次样条插值}
    \subsection*{1.1 算法步骤}
    \addcontentsline{toc}{subsection}{1.1 算法步骤}
    \subsubsection*{1.1.1 测试数据部分}
    \addcontentsline{toc}{subsubsection}{1.1.1 测试数据部分}
    \paragraph*{主要功能}函数运行的入口，负责数据存储，插值函数对给定的点的计算。\\
    1. 设定给定的横纵坐标数据和边界条件；\\
    2. 调用实现的三次样条插值函数$Spline\_task1$获取对应插值函数；\\
    3. 并绘制得到的插值图像，以及计算给定横坐标的函数值。
    \subsubsection*{1.1.2 三次样条插值}
    \addcontentsline{toc}{subsubsection}{1.1.2 三次样条插值}
    \paragraph*{主要功能}实现给定端点条件下的，三次样条插值函数的求解。\\
    1. 判断输入参数的合法性，横纵坐标数是否匹配，端点条件是否合理；\\
    2. 利用教材公式计算$h_k=x_{j+1}-x_k,j=0,1,2,\cdots,n$以及$\mu_k,\lambda_k,d_k$,
    $$\begin{aligned}
    &\mu_k=\frac{h_{j-1}}{h_{j-1}+h_k},\lambda_k=1-\mu_k\\
    &d_k=6\frac{f[x_k,x_{j+1}]-f[x_{j-1},x_k]}{h_{j-1}+h_k},\ j=1,2,\cdots,n-1.
    \end{aligned}
   $$
    3. 对于第一种边界条件和自然边界条件，分别确定$\lambda_0,\mu_n,d_0,d_n$。\\
    \hspace*{10pt}对于第一种边界条件：$$\lambda_0=1,d_0=\frac{6}{h_0}(f[x_0,x_1]-f_0^{'}),\mu_n=1,d_n=\frac{6}{h_{n-1}}(f_n^{'}-f[x_{n-1},x_n]).$$
    \hspace*{10pt}对于自然边界条件：$$\lambda_0=\mu_n=0,d_0=2f_0^{''},d_n=2f_n^{''}.
    M_0=2f_0^{''},M_n=2f_n^{''}.$$
    4. 并分别构造对应的线性方程组$AM=d$，均调用追赶法函数$chase$求解。
    $$A(j,j-1)=\mu(j),A(j,j)=2,A(j,j+1)=\lambda_j,\ j=2,3,\cdots,n-1,$$
    \hspace*{10pt}对于第一种边界条件：$$A(1,1)=A(n,n)=2,A(1,2)=A(n,n-1)=1.$$
    \hspace*{10pt}对于自然边界条件：$M_0,M_n$已经确定，故求解M中间n-2行即可，即$$A(2:n-1,2:n-1)M(2:n-1)=d(2:n-1).$$
    \subsubsection*{1.1.3 追赶法解三对角线矩阵}
    \addcontentsline{toc}{subsubsection}{1.1.3 追赶法解三对角线矩阵}
	\paragraph*{主要功能}实现对于三对角线矩阵$Ax=f$的求解。\\
	1. 判断输入参数的合法性，向量与矩阵的维度是否匹配。\\
	2. 获取下对角线a，主对角线b以及上对角线c的向量。\\
	3. 将三对角线矩阵A分解为$A=LU$，分为$Ly=f$和$Ux=y$进行求解。\\
	4. 求解$U$的元素$$\beta_i=c_i/(b_i-a_i*\beta_{i-1}),i=2,3,\cdots,n-1.$$
	5. 追的过程，进行$Ly=f$的求解，$y_1=f_1/b_1,$
	$$y_i=(f_i-a_iy_{i-1})/(b_i-a_i\beta_{i-1}),\ i=2,3,\cdots,n-1.$$
	6. 赶的过程，进行$Ux=y$的求解，$x_n=y_n,$
	$$x_i=y_i-\beta_ix_{i+1},\ i=n-1,n-2,\cdots,2,1.$$
	\newpage
    \subsection*{1.2 程序清单}
    \addcontentsline{toc}{subsection}{1.2 程序清单}
    \subsubsection*{1.2.1 测试数据部分}
    \addcontentsline{toc}{subsubsection}{1.2.1 测试数据部分}
    \begin{lstlisting}[language=matlab,title=task1\_main.m]
function task1_main()%spline 测试样例
	x=(0.2:0.2:1.0); %存储测试样例数据
	y=[1.01398,0.89177,0.81203,0.72860,0.38437];
	ddx0=0;ddxn=0;dx0=0.20271;dxn=1.55741;
	syms X;
	fprintf("第一种条件下解得\n")
	[M1,S1]=Spline_task1(x,y,1,dx0,dxn)%第一种条件下的插值函数
	for i=0:8 %第一种条件下插值函数在[0.2:1.0:1.0]对应的函数值
		temx=0.2+0.1*i;
		res=eval(subs(S1,X,temx));
		fprintf("x=%.1f时， S1(x)=%.5f\n",temx,res);
	end
	fprintf("自然条件下解得\n")
	[M2,S2]=Spline_task1(x,y,2,ddx0,ddxn)%自然条件下的插值函数
	for i=0:8 %自然条件下插值函数在[0.2:1.0:1.0]对应的函数值
		temx=0.2+0.1*i;
		res=eval(subs(S2,X,temx));
		fprintf("x=%.1f时， S2(x)=%.5f\n",temx,res);
	end
	fplot(S1,[x(1) x(end)],'-c');hold on; %将S1 S2 数据点均绘出
	fplot(S2,[x(1) x(end)],'-b');hold on;plot(x,y,'-.*r');
	xlabel("x");ylabel("y");title("S1,S2,以及原数据点图像");
end\end{lstlisting}
\newpage
    \subsubsection*{1.2.2 三次样条插值}
    \addcontentsline{toc}{subsubsection}{1.2.2 三次样条插值}
    \begin{lstlisting}[language=matlab]
function [M,S]=spline_task1(x,y,flag,xx,yy)%三次样条插值的三弯距法
%x，y为y=f(x)的已知点
%flag为边界条件类型:1.第一种临界条件 2.自然条件
%xx,yy为对应的端点值，M为插值函数的系数，S为对应的函数
%判断参数的合法性
if size(x,2)~=size(y,2)
	error("输入横纵坐标数不匹配");
end
%预处理环节，A M d的初始定义
n=size(x,2);A=zeros(n,n);M=zeros(n,1);d=zeros(n,1);
for j=1:n-1 %计算[xj,xj+1]的步长
	h(j)=x(j+1)-x(j);
end
for j=2:n-1 %计算对应的u,l,d,并构造系数矩阵A
	u(j)=h(j-1)/(h(j-1)+h(j));l(j)=1-u(j);
	d(j,1)=6*((y(j+1)-y(j))/h(j)-(y(j)-y(j-1))/h(j-1))/(h(j-1)+h(j))
	A(j,j-1)=u(j);A(j,j)=2;A(j,j+1)=l(j);
end
switch flag
	case 1
		d(1,1)=6*((y(2)-y(1))/h(1)-xx)/h(1);
		d(n,1)=6*(yy-(y(n)-y(n-1))/h(n-1))/h(n-1);
		A(1,1)=2;A(1,2)=1;A(end,end-1)=1;A(end,end)=2;
		M=chase(A,d);
	case 2
		M(1)=xx;M(n)=yy;
		M(2:end-1,:)=chase(A(2:end-1,2:end-1),d(2:end-1,:));
	otherwise
		error('非法条件');
end
	%实现对于插值函数的构造
end\end{lstlisting}
其中$A(2:end-1,2:end-1)$即取矩阵A的中间n-2行和n-2列；chase即为编写的解三对角线方程的追赶法函数。
\newpage
\begin{lstlisting}[language=matlab,title=spline\_task1.m]
syms S X;S=0; %定义S为函数符号 X为符号变量
for j=1:n-1 %构造S函数
	S_part=M(j)*(x(j+1)-X).^3/(6*h(j))+M(j+1)*(X-x(j)).^3/(6*h(j))
	... +(y(j)-(M(j)*h(j)^2)/6)*(x(j+1)-X)/h(j)
	...	+(y(j+1)-(M(j+1)*h(j)^2)/6)*(X-x(j))/h(j);
	if j==n-1  %S_part加到S上，以坐标范围为逻辑值进行合并
		S=S+(S_part).*(x(j)<=X&X<=x(j+1));
	else
		S=S+(S_part).*(x(j)<=X&X<x(j+1));
	end
end
\end{lstlisting}
通过参考网上对于分段函数的实现，通过横坐标所在区间来决定函数表达式，
即以分段函数的横坐标范围作为逻辑值来乘上每一段函数的表达式。
    \subsubsection*{1.2.3 追赶法解三对角线矩阵}
    \addcontentsline{toc}{subsubsection}{1.2.3 追赶法解三对角线矩阵}
\begin{lstlisting}[language=matlab,title=chase.m]
function x = chase(A,f)%追赶法求解三对角线矩阵 Ax=f
if size(A,1)~=size(f,1)%判断参数的合法性
	error("矩阵和向量维度不匹配");
end %获取三条对角线上的向量
n=size(f,1);a=[0;diag(A,-1)];b=diag(A);c=[diag(A,1);0];
%将求解过程分为Ly=f和Ux=y两个过程
beta=zeros(n-1,1);y=zeros(n,1);x=zeros(n,1);
%L的主对角线全为1，故只需要保留beta次对角线向量
beta(1)=c(1)/b(1);
for i=2:n-1
	beta(i)=c(i)/(b(i)-a(i)*beta(i-1));
end
y(1)=f(1)/b(1);%求解Ly=f
for i=2:n
	y(i)=(f(i)-a(i)*y(i-1))/(b(i)-a(i)*beta(i-1));
end
x(n)=y(n);%求解Ux=y
for i=n-1:-1:1
	x(i)=y(i)-beta(i)*x(i+1);
end end
\end{lstlisting}
    \subsection*{1.3 CPU时间}
    \addcontentsline{toc}{subsection}{1.3 CPU时间}
    \paragraph*{测试说明}
    对于每个函数调用处，均使用$cputime$计算差值方法进行计时，统计3次取平均值。
    两种条件下的求解，均进行测试，对于三次样条插值以及追赶法取其中任意3次结果，作图时间单独测试。\\
	其中追赶法由于时间过短，采取了循环10000次取运行时间的方法。\\
	\begin{tabular}{|c|c|c|c|c|}
    	\hline
    	{\color[HTML]{000000} \textbf{}} & {\color[HTML]{000000} \textbf{测试1}} & {\color[HTML]{000000} \textbf{测试2}} & {\color[HTML]{000000} \textbf{测试3}} & {\color[HTML]{000000} \textbf{3次平均CPU占用时间}} \\ \hline
    	{\color[HTML]{000000} \textbf{第一种条件}} & {\color[HTML]{000000} 0.234375} & {\color[HTML]{000000} 0.187500} & {\color[HTML]{000000} 0.187500} & {\color[HTML]{000000} 0.203125} \\ \hline
    	{\color[HTML]{000000} \textbf{自然条件}} & {\color[HTML]{000000} 0.187500} & {\color[HTML]{000000} 0.187500} & {\color[HTML]{000000} 0.140625} & {\color[HTML]{000000} 0.171875} \\ \hline
    	{\color[HTML]{000000} \textbf{三次样条插值}} & {\color[HTML]{000000} 0.062500} & {\color[HTML]{000000} 0.078125} & {\color[HTML]{000000} 0.093750} & {\color[HTML]{000000} 0.078125} \\ \hline
    	{\color[HTML]{000000} \textbf{追赶法}} & {\color[HTML]{000000} 0.00003125} & {\color[HTML]{000000} 0.000009375} & {\color[HTML]{000000} 0.0000046875} & {\color[HTML]{000000} 0.00001510} \\ \hline
    	{\color[HTML]{000000} \textbf{作图}} & {\color[HTML]{000000} 0.421875} & {\color[HTML]{000000} 0.250000} & {\color[HTML]{000000} 0.187500} & {\color[HTML]{000000} 0.286458} \\ \hline
    \end{tabular}
    \subsection*{1.4 输出计算结果}
    \addcontentsline{toc}{subsection}{1.4 输出计算结果}
    \subsubsection*{第一种边界条件}
    \includegraphics[height=100pt]{task1_case1.png}
    \subsubsection*{自然边界条件}
    \includegraphics[height=100pt]{task1_case2.png}\\
    \includegraphics[height=200pt]{task1.png}
    \subsection*{1.5 结果分析}
    \addcontentsline{toc}{subsection}{1.5 结果分析}
    通过观察，对应结点的插值函数值与原值均能较好匹配，且两种条件下的插值函数图像与原图像也较为贴合。
    \subsection*{1.6 小结}
    \addcontentsline{toc}{subsection}{1.6小结}
    通过编程实习题1，进一步加深了对于三次样条插值法的原理和具体计算操作的理解。同时也基本熟悉了
    Matlab作为崭新的编程工具的使用方法，体会到其在矩阵运算，函数计算，绘图等多方面的强大之处。
    \newpage
    \section*{实习题二之方程组的性态和条件数的关系}
	\markright{实习题二之方程组的性态和条件数的关系}
    \addcontentsline{toc}{section}{实习题二之方程组的性态和条件数的关系}
    \subsection*{2.1 算法步骤}
	\addcontentsline{toc}{subsection}{2.1 算法步骤}
	\subsubsection*{2.1.1 程序主逻辑}
	\addcontentsline{toc}{subsubsection}{2.1.1 程序主逻辑}
	\paragraph*{主要功能}调用其他步骤的函数进行对应运算。\\
	1. 依次调用每一步的函数脚本，得到输出结果即可。
	\subsubsection*{2.1.2 测试数据部分}
	\addcontentsline{toc}{subsubsection}{2.1.2 测试数据部分}
	\paragraph*{主要功能}构造A1 A2 b1 b2的数据。
	1. 构造A1和A2矩阵\\
	\hspace*{10pt}A1的第i列是通过向量$x=[1:0.1:2]$生成，
	$A_1=[1],A_i=A_{i-1}.*x$；\\
	\hspace*{10pt}A2的第i行第j列的元素可表示为$A(i,j)=\frac{1}{i+j-1}$。\\
	2. 构造b1和b2向量，每一元素为对应矩阵行各元素和，$b=sum(A,2)$。\\
	\subsubsection*{2.1.3 程序计算脚本}
	\addcontentsline{toc}{subsubsection}{2.1.3 程序计算脚本}
	\paragraph*{主要功能}按照实习题要求，每一步编写一个计算脚本，实现对应要求。
	\\1. 实现$n=4,5,\cdots,8$对应的$A_1,A_2$的条件数的求解。\\
	2. 在$n=5$时，求解$A_1x=b_1,A_2x=b_2$两个线性方程组，得到解$x_1,x_2$。\\
	3. 在$n=5$时，对$A_1(2,2),A_1(6,6)$加一个扰动，得到新的解$\overline{x_1}$。\\
	4. 在$n=5$时，对$A_2(2,2),A_2(6,6)$加一个扰动，以及对$b_2$加一个扰动，
	\hspace*{10pt}分别得到解$\overline{x_2},\widetilde{x_2}$。\\
	5. 分别计算$\frac{\Vert x_1-\overline{x_1}\Vert_{max}}{\Vert x_1 \Vert_{max}}$，
	$\frac{\Vert x_2-\overline{x_2}\Vert_{max}}{\Vert x_2 \Vert_{max}}$，
	$\frac{\Vert x_2-\widetilde{x_2}\Vert_{max}}{\Vert x_2 \Vert_{max}}$。
	\newpage
	\subsection*{2.2 程序清单}
	\addcontentsline{toc}{subsection}{2.2 程序清单}
	\subsubsection*{2.2.1 程序主逻辑}
	\addcontentsline{toc}{subsubsection}{2.2.1 程序主逻辑}
	\begin{lstlisting}[language=matlab,title=task2\_main.m]
function task2_main()%task2 主程序
Step1();
[A1,A2,b1,b2]=data_create(5);%得到n=5时的对应的矩阵和向量
[res1,res2]=Step2(A1,A2,b1,b2);
res3=Step3(A1,b1);
[res4,res5]=Step4(A2,b2);
Step6(res1,res2,res3,res4,res5);
%所有的子程序
end\end{lstlisting}
	\subsubsection*{2.2.2 测试数据部分}
	\addcontentsline{toc}{subsubsection}{2.2.2 测试数据部分}
\begin{lstlisting}[language=matlab,title=data\_create.func]
%生成n+1规模的A1 A2矩阵和b1 b2向量数据
function [A1,A2,b1,b2]=data_create(num)
x=zeros(num+1,1);
for i=0:num %生成A1矩阵的第2列
	x(i+1)=1+0.2*i;
end
A1=[ones(num+1,1),x,zeros(num+1,num-1)];
for i=2:num+1 %生成A1矩阵
	A1(:,i)=A1(:,i-1).*x;
end
A2=zeros(num+1);
for i=1:num+1 %生成A2矩阵
	for j=1:num+1
		A2(i,j)=1/(i+j-1);
	end
end
b1=sum(A1,2); b2=sum(A2,2);%生成b1和b2，每一列为原矩阵每一行的总和
end
\end{lstlisting}
\newpage
	\subsubsection*{2.2.3 程序计算脚本}
	\addcontentsline{toc}{subsubsection}{2.2.3 程序计算脚本}
	\begin{lstlisting}[language=matlab,title=Step1.func]
function Step1()%计算n=4-8的对应A1 A2的条件数的求解
	fprintf("第(1)问\n");
	for n=4:8
		[A1,A2,b1,b2]=data_create(n);
		fprintf("n=%d时,A1的2-条件数为%f，A2的2-条件数为%f\n",...
			n,cond(A1),cond(A2));%cond 获取矩阵的条件数
	end
end\end{lstlisting}
	\begin{lstlisting}[language=matlab,title=Step2.func]
function [res1,res2]=Step2(A1,A2,b1,b2)%计算A1x=b1和A2x=b2的解
	fprintf("第(2)问\n");
	fprintf("A1解为\n");
	res1=A1\b1
	fprintf("A2解为\n");
	res2=A2\b2
end
\end{lstlisting}
	\begin{lstlisting}[language=matlab,title=Step3.func]
function [res]=Step3(A1,b1)%A1扰动后的解
	fprintf("第(3)问\n");
	A1(2,2)=A1(2,2)+1e-12;
	A1(6,6)=A1(6,6)+1e-12;
	fprintf("扰动后 A1解为\n");
	res=A1\b1
end\end{lstlisting}
	\begin{lstlisting}[language=matlab,title=Step4.func]
function [res1,res2]=Step4(A2,b2)%A2 b2分别扰动后的解
	fprintf("第(4)问\n");temA2=A2;
	A2(2,2)=A2(2,2)+1e-7;
	A2(6,6)=A2(6,6)+1e-7;
	fprintf("A2扰动后 A2解为\n");res1=A2\b2
	b2(end)=b2(end)+1e-4;
	fprintf("b2扰动后 A2解为\n");res2=temA2\b2
end\end{lstlisting}
	\begin{lstlisting}[language=matlab,title=Step6.func]
function [res1,res2,res3]=Step6(r1,r2,r3,r4,r5) 
	%r1,r2分别为A1,A2扰动前结果，r3为A1扰动后结果，
	%r4为A2扰动后结果，r5为b2扰动后结果
	fprintf("第(6)问\n");
	res1=max(abs(r1-r3))/max(abs(r1)); %计算对应的inf-范数
	fprintf("A1扰动变化: %e\n",res1);
	res2=max(abs(r2-r4))/max(abs(r2));
	fprintf("A2扰动变化: %e\n",res2);
	res3=max(abs(r2-r5))/max(abs(r2));
	fprintf("b2扰动变化: %e\n",res3);
end\end{lstlisting}
    \subsection*{2.3 CPU时间}
	\addcontentsline{toc}{subsection}{2.3 CPU时间}
	由于程序逻辑简单，运行时间极短，
	与测试追赶法运行时间相同，采用循环多次的方式来取得CPU占用时间。\\
	\begin{tabular}{|c|c|c|c|c|}
		\hline
		{\color[HTML]{000000} \textbf{}}      & \multicolumn{1}{c|}{{\color[HTML]{000000} \textbf{测试1}}} & \multicolumn{1}{c|}{{\color[HTML]{000000} \textbf{测试2}}} & \multicolumn{1}{c|}{{\color[HTML]{000000} \textbf{测试3}}} & \multicolumn{1}{c|}{{\color[HTML]{000000} \textbf{三次平均CPU占用时间}}} \\ \hline
		{\color[HTML]{000000} \textbf{Step1}} & {\color[HTML]{000000} 0.00004531}                        & {\color[HTML]{000000} 0.00001563}                        & {\color[HTML]{000000} 0.00001719}                        & {\color[HTML]{000000} 0.00002604}                                \\ \hline
		{\color[HTML]{000000} \textbf{Step2}} & {\color[HTML]{000000} 0.00001250}                        & {\color[HTML]{000000} 0.00000781}                        & {\color[HTML]{000000} 0.00000938}                        & {\color[HTML]{000000} 0.00000990}                                \\ \hline
		{\color[HTML]{000000} \textbf{Step3}} & {\color[HTML]{000000} 0.00000469}                        & {\color[HTML]{000000} 0.00000625}                        & {\color[HTML]{000000} 0.00000625}                        & {\color[HTML]{000000} 0.00000573}                                \\ \hline
		{\color[HTML]{000000} \textbf{Step4}} & {\color[HTML]{000000} 0.00001406}                        & {\color[HTML]{000000} 0.00000781}                        & {\color[HTML]{000000} 0.00000938}                        & {\color[HTML]{000000} 0.00001042}                                \\ \hline
		{\color[HTML]{000000} \textbf{Step6}} & {\color[HTML]{000000} 0.00000125}                        & {\color[HTML]{000000} 0.00000047}                        & {\color[HTML]{000000} 0.00000078}                        & {\color[HTML]{000000} 0.00000083}                                \\ \hline
	\end{tabular}\\
    \subsection*{2.4 输出计算结果}
	\addcontentsline{toc}{subsection}{2.4 输出计算结果}
	\begin{figure}[H]
		\centering
		\subfigure[第(1)问]{\label{fig:}
		\includegraphics[height=80pt]{task2_1.png}
		}\\
		\subfigure[第(2)问]{\label{fig:}
		\includegraphics[height=130pt]{task2_2.png}
		}\\
		\subfigure[第(3)问]{\label{fig:}
		\includegraphics[height=130pt]{task2_3.png}
		}
		\subfigure[第(4)问]{\label{fig:}
		\includegraphics[height=130pt]{task2_4.png}
		}
		\subfigure[第(6)问]{\label{fig:}
		\includegraphics{task2_6.png}
		}
	\end{figure}
	\newpage
    \subsection*{2.5 结果分析}
	\addcontentsline{toc}{subsection}{2.5 结果分析}
	\paragraph*{(1)}A1,A2的条件数随着矩阵规模的增加而增加，矩阵病态越来越严重。\\
	对于A1，维度每增加1，条件数大致变为原来15倍；\\
	对于A2，维度每增加1，条件数大致变为原来32倍。
	\paragraph*{(5)}观察实验结果可知，
	对于$A_1$，$A_1$的微小扰动对解的相对影响大致为
	$$\frac{\Vert x_1-\overline{x_1}\Vert_{max}}{\Vert x_1\Vert_{max}}/
	\frac{\Vert\delta A_1\Vert_{max}}{\Vert A_1\Vert_{max}}
	\approx \frac{5.465279\times 10^{-9}}{10^{-12}}\approx 5.465\times10^{-3}.$$
	对于$A_2$，$A_2$的微小扰动对解的相对影响大致为
	$$\frac{\Vert x_2-\overline{x_2}\Vert_{max}}{\Vert x_2\Vert_{max}}/
	\frac{\Vert\delta A_2\Vert_{max}}{\Vert A_2\Vert_{max}}
	\approx \frac{ 1.837363\times 10^{-1}}{10^{-7}}
	\approx 1.837\times10^{6}.$$
	$b_2$的微小扰动对解的相对影响大致为
	$$\frac{\Vert x_2-\widetilde{x_2}\Vert_{max}}{\Vert x_2\Vert_{max}}\
	\frac{\Vert\delta A_2\Vert_{max}}{\Vert A_2\Vert_{max}}
	\approx \frac{1.746360\times 10^{2}}{10^{-4}}
	\approx 1.746\times10^{6}.$$
	对于$A_1$的微小扰动对解向量的影响
	相对于$A_2$和$b_2$的微小扰动带来的影响较小。即$A_2$的病态性比$A_1$要更加严重。
	\paragraph*{(6)}
	易知本题中$\Vert A^{-1}\Vert\Vert\delta A\Vert<1$成立，解的相对误差的上界公式
	$$\frac{\Vert \delta x\Vert}{\Vert x\Vert}\leq \frac{\Vert A^{-1}\Vert \Vert A\Vert}{1-\Vert A^{-1}\Vert \Vert A\Vert\frac{\Vert\delta A\Vert}{\Vert A\Vert}}(
	\frac{\Vert \delta A\Vert}{\Vert A\Vert} +\frac{\Vert \delta b\Vert}{\Vert b\Vert}).$$
	当A精确，b有扰动时，即$\Vert \delta A\Vert=0$，相对误差的上界公式为
	$$\frac{\Vert \delta x\Vert}{\Vert x\Vert}\leq \Vert A^{-1}\Vert \Vert A\Vert 
	\frac{\Vert \delta b\Vert}{\Vert b\Vert}.$$
	即b的误差被放大$\Vert A^{-1}\Vert \Vert A\Vert$倍，对A取2-范数，
	则放大倍数上界即为矩阵的条件数，
	对于$A_2,n=5,cond(A_2)=1.495106\times 10^{7}$，则相对误差为
	$$cond(A_2)\times\frac{\Vert \delta b\Vert_{max}}{\Vert b\Vert_{max}} 
	\approx 6.10247\times10^{2}>\frac{\Vert x_2-\widetilde{x_2}\Vert_{max}}{\Vert x_2\Vert_{max}}
	\approx  1.7464\times 10^{2}.$$
	当b精确，A有扰动时，即$\Vert \delta b\Vert=0$，其相对误差的上界公式为
		$$\frac{\Vert \delta x\Vert}{\Vert x\Vert}\leq 
		\frac{\Vert A^{-1}\Vert \Vert A\Vert \frac{\Vert \delta A\Vert}{\Vert A\Vert}}
		{1-\Vert A^{-1}\Vert \Vert A\Vert\frac{\Vert\delta A\Vert}{\Vert A\Vert}}.$$
	对于$\delta A$相对于$A$充分小，则其相对误差放大倍数上界为矩阵条件数，
	对A1，A2进行验证，其中$cond(A_1)=8.901704\times10^{5},cond(A_2)=1.495106\times 10^{7}.$
	$$\begin{aligned}
	&cond(A_1)\times\frac{\Vert \delta A_1\Vert_{max}}{\Vert A_1\Vert_{max}} 
	\approx 8.90170\times10^{-7}>\frac{\Vert x_1-\overline{x_1}
		\Vert_{max}}{\Vert x_1\Vert_{max}}
	\approx  5.46528\times 10^{-9}.\\
	&cond(A_2)\times\frac{\Vert \delta A_2\Vert_{max}}{\Vert A_2\Vert_{max}} 
	\approx 1.49511>\frac{\Vert x_2-\overline{x_2}
		\Vert_{max}}{\Vert x_2\Vert_{max}}
	\approx  1.83736\times 10^{-1}.
	\end{aligned}
	$$
	易知均较好的满足了相对误差的上界公式，即相对误差在解中放大的倍数最多为矩阵的条件数。
	即矩阵的条件数很好的反映了矩阵的病态特征。
    \subsection*{2.6 小结}
    \addcontentsline{toc}{subsection}{2.6小结}
    通过实习题2，通过实际计算病态矩阵的方式深刻体会到条件数在分析矩阵病态特性的重要作用和其使用方法。
    除此之外，我在编程过程中，尝试子程序的编写，发现了更多matlab中好用又准确的函数。
    \section*{实验感想与总结}
	\markright{实验感想与总结}
    \addcontentsline{toc}{section}{实验感想与总结}
    自从上计算方法课以来，学习了很多的理论知识，涉及到微积分和线性代数许多内容，原本可能忘记的知识
    也在学习过程中重新拾起。在学习课本那些定理的证明和使用固然有趣，但是配合上这种实习题编程实验更能让我体会到其中奥妙。
    \par
    初次接触matlab，编程中出现了各种各样的问题，测试中出现各式各样的bug，不清楚matlab中自带函数，自己去实现模拟，走了很多弯路。但是就是这逐步克服困难的过程才是编程和计算方法理论结合真正的闪光点。
    \section*{提交文件结构}
    \markright{提交文件结构}
    \addcontentsline{toc}{section}{提交文件结构}
    \includegraphics{submit_file.png}
\end{document}